אלגוריתמים 1 דפי עזר DA אלגוריתמים מיון טופולוגי קלט: גרף שהוא פלט: מיון טופולוגי של הגרף חשב את קבוצת כל המקורות בגרף, נסמנה ב- S 1 אתחל 2 3 בחר 1 S L l מהגרף, יחד עם כל הקשתות היוצאות ממנו : ll1 l 1 כל עוד V קבע קבע הסר את \ קבע S S הוסף ל- S את כל הצמתים מבין שהם מקורות L 2 3 4 5 6 4 החזר את BFS(,): 1 for any n V do a d[] := b p[] := nl 2 Q := }}; d():=0 3 whl Q not mpty do a := dq(q) b for ach n ad() do f d[] = thn 1 d[] := d[] + 1 2 p[] := 3 nq(q,) DFS(,): 1 for all n V a k[] := 0 b p[] := nl 2 :=0 3 whl thr a rtx wth k()=0 a SACK:={}, :=+1, k[]:= b Whl SACK := had(sack) f thr ad() t k[]=0 1 :=+1 2 k[]:= 3 p[]:= 4 ph(sack,) l 1 pop(sack) Strongly_Connctd_Componnt(): 1 Call DFS() to compt f[] for all n V 2 Compt 3 Call DFS( ) on th rtc ordrd n dcrang ordr of f[] (comptd n (1)) 4 otpt th rtc n ach DFS tr gnratd n (3) a parat componnt
הכלל האדום )לקשתות כבדות(: תנאי: קיים ב מעגל C חסר קשתות אדומות, ו היא קשת לא צבועה בעלת משקל מקסימאלי )מבין הקשתות הלא צבועות( ב C פעולה: צבע את באדום הכלל הכחול )לקשתות קלות(: תנאי: קיים ב חתך D חסר קשתות כחולות, ו היא קשת לא צבועה בעלת משקל מינימאלי )מבין הקשתות הלא צבועות( ב D פעולה: צבע את בכחול האלגוריתם הגנרי: בחר קשת כלשהי עליה ניתן להפעיל את הכלל האדום או הכלל הכחול, והפעל כלל זה עצור כאשר אין ב קשת כזו האלגוריתם של Prm, U : U, V \ U אתחול כל הקשתות אינן צבועות; r כל עוד U V בצע: א הפעל את הכלל הכחול על חתך מינימאלית בחתך זה כך ש- ; U, V \ U בצע וצבע בכחול קשת U : U (, ) האלגוריתם של Krkal מיין את הקשתות בסדר לא יורד לפי משקל 1 עבור על הרשימה הממוינת, ולכל קשת 2 א אם יש מסלול כחול מ ל, צבע את ב אחרת צבע את בכחול אלגוריתם לעפ"מ צהוב ביותר נגדיר פונקצית משקל חדשה 2 w 1/ n yllow w' w othrw בצע: באדום, w: N 1 2 קלט: גרף לא מכוון וקשיר ופונקצית משקל פלט: עפ"מ צהוב ביותר של 1 חשב את פונקצית המשקל 2 מצא עפ"מ לפי פונקצית המשקל, והחזר את כפלט אלגוריתם גנרי למסלולים קלים ביותר ממקור יחיד פונקציית חסם עליון על מרחקים )בקיצור פח"ע(: זוהי פונקציה :d V R המקיימת: w' w' dt, d,d() 0 שיפור מקומי על קשת (,) :rlaxaton בהינתן פח"ע d, שיפור מקומי על קשת (,) הוא d d w, אז d d w, הכלל: אם, d d w האלגוריתם הגנרי: 1 קבע פח"ע כל זמן שקיימת קשת כך ש בצע שיפור V, d 2 אלגוריתם בלמן-פורד: קלט: גרף מכוון פלט: לכל צומת ממושקל, ללא מעגלים שליליים, וצומת parnt() nl, d dt V \{ } - האלגוריתם: אתחול: לכל אתחל ; d 0 עבור = 1 עד 1 V בצע לכל קשת בצע שיפור a 1 2
) dt, d אלגוריתם דייקסטרה: קלט: גרף ממושקל מכוון ללא משקלים שליליים, וצומת dt, d d() ואתחל 0,d() אתחל V Q ( Q V - פלט: לכל צומת האלגוריתם: 1 לכל בנוסף אתחל כל זמן ש Q בצע a מצא ב- Q צומת מכיל את כל הצמתים עבורם כך ש d מינימאלי הוצא את מ- Q ולכל קשת בצע שיפור ו- ' : V V ' V b 2 3 אלגוריתם ג'ונסון: כמו כן נגדיר לכל קשת אחרת נסמן ב- w: R ו- ' w w ל- ב- ' נגדיר גם נגדיר גרף חדש ' V ', ' כך ש- w' לכל כך ש- 0 :'w R את משקל המסלול הקל ביותר מ- w w V קלט: גרף מכוון עם פונקציית משקל על הקשתות שליליים פלט: משקל מסלול קל ביותר מכל צומת לכל צומת 1 בנה את כפי שהוגדר לעיל ללא מעגלים ' חשב את כפי שהוגדר לעיל, בעזרת האלגוריתם של Bllman Ford w חשב את פונקצית המשקל מכל צומת V הצמתים, ביחס לפונקציית המשקל הרץ דייקסטרה לחישוב משקל מסלולים קלים ביותר מ- נסמן את הערך המתקבל ב- לכל d ', f d ', w, עבור כל זוג צמתים V החזר כפלט אלגוריתם חמדן למציאת מספר מקסימלי של קטעים זרים: S a,, 1 an 2 3 4 5 קלט: אוסף משימות לכל משימה זמן התחלה וזמן סיום A של משימות )או קטעים( הזרים בזוגות פלט: תת קבוצה מקסימלית S האלגוריתם: 1 מיין את המשימות לפי סדר עולה של זמני סיום )מעכשיו נניח כי המשימות מסודרות כך ש ) f f f ( f0 1 2 n אתחל 0, A ו- שנכללת בפתרון, ו- נק' הסיום שלה( הוא האינדקס של המשימה האחרונה m A A a m f עבור m 1 עד n א אם בצע: f אז ו-, )אם המשימה האחרונה ב- A a m a m m הסתיימה לפני ש מתחילה, הוסף את לA ( 2 3 אלגוריתם חמדן לצביעת גרף: קלט: גרף לא מכוון, וסדר כלשהו על הצמתים d1 1 צבעים פלט: צביעה חוקית של המשתמשת לכל היותר ב - 1 עבור צומת צומת ע"פ הסדר הנתון של הצמתים יהא הצומת הנוכחי א קבע את c להיות הצבע המינימאלי שאינו בשימוש על ידי שכניו של c
xy, אלגוריתם Hffman לקוד פרפיקסי אופטימלי: :Rcr_Hffman( ) [, f ] [, f ] קלט: א"ב עם תדירות לכל אות פלט: עץ האפמן של ] f [, אם 2 אם החזר עץ בעל שני עלים שהם שני איברי [ ', f '] : 2 יהי א מינימאלית ב הקלט הנוצר על ידי החלפת שתי אותיות באות חדשה שתדירותה בעלי תדירות ' f z f x f y ' z [ ', f '] ) := Rcr_Hffman( ב הוסף לעלה המתאים ל- z ב-' את ו- y כבנים, והחזר את העץ שהתקבל אלגוריתם פלויד וורשל למציאת כל המסלולים הקלים ביותר: )גרסה שקולה לזו שהועברה בכיתה(, k, x שיפור מקומי באמצעות צמת ביניים )שיפור מקומי מוכלל( עבור שלשה הוא הכלל: w : V V R השווה ל 0 אם ) d(, k) + d(k, ) < d(, אז ) d(, ) d(, k) + d(k, 1 2 קלט: בה"כ נניח כי עם פונקציית משקל :w, R ללא מעגלים שליליים, ונגדיר את פונקציית המשקל המוכללת dt, - V 1,, n אם, = ל - ) w(, אם (, ) ול - אחרת, פלט: לכל זוג צמתים V אתחול: לכל זוג צמתים בצע מוחזר המרחק מ- ל-, w, d, k,,, n עבור k 1 בצע עד לכל זוג צמתים בצע שיפור האלגוריתם קבוצה בלתי תלויה של קטעים בעלת משקל מקסימלי: אתחול: 1 מיין את המטלות לפי סדר עולה של זמני סיום לאחר המיון f1 f2 fn opt, ו- 0 0 prd A(0) אתחל לכל מצא את 2 3 גוף האלגוריתם: 1 עבור 1 עד n בצע opt opt prd w 1 אם א אז A A prd a opt opt prd w opt A A 1 opt 1 An ב אחרת א ב החזר 2 3 4
אלגוריתם תכנות דינמי לבעיית ה- Knapack : קלט: פריטים a 1, a 2,, a n כאשר ערכיהם p 1, p 2,, p n ומשקליהם w 1, w 2,, w n וכן קיבולת שק W פלט: הערך המקסימלי של קבוצת פריטים העומדת בקיבולת השק F k, w n1 W צור מטריצה F מגודל 1 אתחל = 0 w) F(0, לכל w W 0 עבור מהשורה המתאימה ל- k 0 א חשב את כל כניסות השורה לפי הנוסחא: k עד לשורה המתאימה ל- n F k 1, w wk w max F k 1, w, pk F k 1, w wk othrw p שפר את הזרימה לאורך, f 4 החזר את W) F(n, האלגוריתם הגנרי של פורד-פלקרסון לזרימת מקסימום: t קבע f 0 לכל קשת כל עוד קיים מסלול שיפור p מ ב אל t n 1 2 3 1 2 האלגוריתם של אדמונדס-קרפ: קבע f 0 לכל קשת כל עוד קיים מסלול שיפור מ- ב- אל, f יהא p מסלול השיפור הקצר ביותר, שפר V ' V, t 1 2 את הזרימה לאורך p אלגוריתם שידוך מקסימום בגרף דו-צדדי: נגדיר את הגרף המכוון ' ' V ', באופן הבא ', : L, :, L, R, t : R ' N ' ',, t, c ונצייד כל קשת עם קיבול יחידה M קלט: גרף דו-צדדי פלט: שידוך מקסימום עבור בנה את רשת הזרימה עם כפי שהוגדר לעיל ו- 1 c הרץ את אלגוריתם פורד-פולקרסון לחישוב זרימת מקסימום ב- ' N M : f, 1 החזר טענות ומשפטים שימושיים p() 1 2 3 סיווגי קשתות ביער :DFS קשתות עץ: קשתות אחוריות: קשת קשת עץ אםם שמחברת את לאב קדמון של בעץ DFS )לולאה עצמית מ- תחשב כקשת אחורית( קשתות קדמיות: קשתות לצאצא של בעץ DFS קשותות חוצות: כל הקשתות האחרות ב בין צמתים באותו עץ DFS ללא יחס אב קדמון צאצא, או בין עצי DFS שונים הקשר בין סוגי הקשתות לזמני הגילוי והנסיגה הוא הקשר הבא: d d f f d f d f d d f f קשת קשת היא קשת עץ או קשת קדמית אם"ם היא קשת אחורית אם"ם קשת היא קשת חוצה אם"ם
משפט המסלול הלבן: ביער ה- DFS של גרף )מכוון או לא מכוון(, צומת )דהיינו בנקודת הזמן הוא צאצא של צומת אם"ם בזמן גילוי ל- גרף הרכיבים קשירים היטב: נניח שהרק"ה ב- הם ) d קיים מסלול מ- C,, 1 Ck גרף הרכיבים קשירים היטב של, שיסומן { יש ב- קשת שיוצאת מצומת ב- דרך צמתים שטרם התגלו V 1 k C * {,, } *), * ( V*, מוגדר באופן הבא * {(, ) אל צומת ב-: C למה: גרף הרק"ה * הוא אציקלי למה: בכל ריצת אלגוריתם,DFS כל רכיב קשיר היטב מוכל במלואו באחד מעצי ה- DFS שהאלגוריתם מחזיר שמורת הצבע: גרף שחלק מקשתותיו כחולות וחלק אחר אדומות מקיים את שמורת הצבע אםם קיים ב עפ"מ שמכיל את כל הקשתות הכחולות ואף אחת מהקשתות האדומות למה: בכל ביצוע של האלגוריתם הגנרי על גרף לא מכוון משוקלל וקשיר )שקשתותיו מלכתחילה אינן צבועות(, הגרף מקיים את שמורת הצבע למה: לכל עפ"מ קיימת ריצה של קרוסקל המוצאת אותו וריצה של פרים המוצאת אותו למה: יהא משקל על הקשתות המקיימות גרף לא מכוון וקשיר יהיו w : R, w': R w w 1 2 אם"ם w' w' 1 2 1, 2 למה: יהא הוא עפ"מ לפי w 1 אם"ם הוא עפ"מ לפי w 2 כל עפ"מ של למה: קשת גרף לא מכוון וקשיר עם פונקצית משקל w: R שתי פונקציות לכל זוג קשתות לכל משקל נתון, מכיל את אותו מספר של קשתות ממשקל זה נמצאת באיזשהו עפ"מ של אם"ם כל מעגל המכיל את מכיל קשת ' כך ש- ' w למה: קשת w נמצאת בכל עפ"מ של אם"ם כל מעגל המכיל את מכיל קשת ' ' w w למה: אם אין ב- מעגלים שליליים כך ש- )שסכום משקלי קשתותיהם שלילי( שניתנים להגעה מ- אזי לכל שניתן להגעה מ- קיים מסלול קל ביותר מ- ל- מבנה אופטימאלי של מסלולים קלים ביותר: אם כל תת-מסלול של P הוא מסלול קל ביותר מ-, אז ל- P אי-שוויון המשולש: לכל הוא מסלול קל ביותר בין זוג הצמתים המתאימים,, w מתקיים,,, dt dt w dt w למה: יהי ) ( V, גרף משוקלל, שאין בו מעגל בעל משקל שלילי המכיל את תהי { } R d: V פח"ע אז 2 הטענות הבאות נכונות: 1 d נשארת פח"ע גם אחרי ביצוע שיפור,, d dt, 2 אם לכל קשת מקומי( אז לכל צומת מתקיים d d w מתקיים )כלומר לא ניתן לבצע שיפור ( 1,, n "קידוד של " הוא מיפוי קידוד של א"ב, קוד: נתון א"ב סופי } {0,1} C : המתאים לכל אות ב מילה בינארית C( ) w קבוצת המלים { w1 היא "קוד", שגם הוא נקרא C לכל מילה ב C ( ), היא המלה הבינארית,, w n } המתקבלת משרשור הקידודים של האותיות ב * קוד חד פענח: לכל זוג מלים שונות,, צריך ש ) C( ) C( 1 2 1 2 קוד פרפיקסי )חסר רישות(: אף מילת קוד אינה פרפיקס )רישא( של מילת קוד אחרת רשת זרימה: רביעיה קשתות מקבילות, כאשר N,, t, c, כאשר t V הוא צומת "מקור" ו- t הוא גרף מכוון ללא לולאות או הוא צומת "בור" c : R היא
n( ) לכל צומת, c פונקציית קיבול המגדירה לכל קשת קבוצת הקשתות הנכנסות לצומת ו קיבול אי שלילי היא קבוצת הקשתות היוצאות ממנו היא f() ot( ), f : R היא פונקציה המגדירה לכל קשת את כמות הזרימה פונקצית זרימה: העוברת בה פונקצית זרימה חייבת לקיים שני אילוצים: 1 אילוץ הקיבול )נקרא גם חוק הקשת( לכל קשת מתקיים (, 0 f ( ( c( כלומר הזרימה דרך קשת היא אי שלילית ואינה יכולה לחרוג מקיבול הקשת שימור הזרימה )נקרא גם חוק הצומת( לכל צומת {t V }\, )כלומר שאינו מקור או n f ot בור( מתקיים f, כלומר סה"כ הזרימה הנכנסת לצומת שווה : S f F לסה"כ הזרימה היוצאת מממנו ערך )או חוזק( פונקצית הזרימה: הזרימה נטו הנכנסת לבור מסומן ב או S, t S S חתך -t מקיים S V, S V S n t ot t 2 F f f חתך -t ברשת זרימה: חתך יהי הוא חלוקה של V: חתך נתון S) ( S היא קבוצת הקשתות החוצות את החתך מ ל )ב"כיוון ( S S ) {(, ) : S, S} הקדמי"(: היא קבוצת הקשתות החוצות אותו ב"כיוון האחורי", c c S S S S f ( S S) {(, ) : S, S} למה: לכל חתך ולכל פונקצית זרימה מתקיים F f f SS S S קיבול של חתך למה: לכל חתך, SS : סכום קיבולי הקשתות החוצות אותו בכיוון הקדמי: F c S S, מתקיים f ולכל פונ' זרימה
הגרף השיורי ומסלולי שיפור: רשת זרימה וזרימה ופונקציית זרימה f המוגדרת עליה מגדירים לכל קשת, עם קיבול c f קשת קדמית קשת אחורית הגרף השיורי מסלול שיפור שתי קשתות אנטי מקבילות עם קיבול שיורי capacty) :(rdal עם קיבול שיורי c f, עם קיבול שיורי f f הוא אוסף כל הקשתות עם קיבול שיורי חיובי )ביחס ל- ו- f(: מסלול מ- ל t - f בגרף השיורי משפט חתך מינימום זרימת מקסימום Flow) :(Mn Ct Max f תהי פונקצית זרימה ברשת זרימה N,, t, c f 1 2 זרימת מקסימום אין מסלול שיפור מ- ל- t בגרף השיורי הטענות הבאות שקולות: f קיים חתך 3 למה: אם לכל קשת t עבורו F c S, S, הקיבול c הוא מספר שלם אז קיימת ברשת זרימת מקסימום בשלמים, ושיטת פורד פלקרסון תמיד תעצור ותמצא זרימת מקסימום בשלמים זרימה במספר בורות ומספר מקורות: על מנת למצוא זרימת מקסימום כאשר ישנם מספר בורות ומספר מקורות נוסיף צומת חדש שיהיה המקור היחיד, ונמתח ממנו קשתות בקיבול לכל אחד מהמקורות הישנים באופן דומה, נוסיף צומת חדש t שיהיה הבור היחיד, ונמתח אליו קשתות בקיבול מכל אחד מהבורות הישנים זרימה עם אילוצי קיבול על הצמתים: נפצל כל צומת V לשני צמתים n ו- ot את כל הקשתות שנכנסו ל- נכוון ל- n ואת כל הקשתות שיצאו מ- נוציא מ- ot כמו כן נוסיף קשת חדשה ) ot ( n שקיבולה c()
סיבוכיות של אלגוריתמים בעיה מיון טופולוגי אלגוריתם מבוסס מחיקת מקורות BFS סיבוכיות הערות DA בלבד O(V + ) DFS מבוסס DFS מסלולים קצרים ביותר גרף הרכיבים קשירים היטב עץ פורש מינימום עץ פורש מינימום מסלולים קלים ביותר ממקור יחיד מסלולים קלים ביותר ממקור יחיד מסלולים קלים ביותר בין כל זוג מסלולים קלים ביותר בין כל זוג מספר מקסימלי של קטעים זרים צביעת גרף ב-+ d 1 1 צבעים בניית עץ Hffman קבוצה בלתי תלויה של קטעים בעלת משקל מקסימלי Knapack זרימת מקסימום פרים קרוסקל בלמן פורד דיקסטרה ג'ונסון פלויד-וורשל חמדן חמדן רקורסיבי מבוסס תכנות דינמי מבוסס תכנות דינמי כל אלגוריתם המתאים לאלגוריתם הגנרי של פורד פלקרסון מוצא מעגלים שליליים אם יש קשתות במשקל אי שלילי בלבד מוצא מעגלים שליליים אם יש f הוא ערך הזרימה המקסימלית ברשת התכנסות מובטחת רק במקרה של זרימה בשלמים O(V + ) O(V + ) O(V + ) מבוסס מערך ) 2 O(V מבוסס ערימה O(logV) מבוסס O(logV) UF O(V) O(logV) O(VlogV) O(V 3 ) O(nlogn) O(V + ) O(nlogn) O(nlogn) O(nW) O(f ) O(V 2 ) O(V) זרימת מקסימום שידוך מקסימום בגרף דו-צדדי אדמונדס-קרפ מבוסס זרימה